#include<bits/stdc++.h> 
using namespace std;
//  根据一个展示提交成绩的状态列表，需要生成一个PAT的排名列表
//1.第一行输入三个正整数N≤10000，表示总的用户数，K≤5，表示问题总数，M≤100000，表示提交
//	总数。假设用户的id是00001~0000N的五位数码，问题id从1~K。
//2.第二行包括K个正整数，表示每道题目的满分
//3.然后M行，每行表示一次提交记录，结构为：用户id  问题id  本次获得的分数。如果提交没过，
//	则获得-1分 
//4. 输出格式每一行为  排名  用户id  总分  每门课的提交分数。其中排名根据总分排名，同样分
//	数获得同样排名。如果某题目没有提交就输出-。如果某题多次提交则取最高。
//5. 有同分数的，按照满分题数比非递增排序，如果仍然有一致的，根据id递增排序。如果有人
//	没提交过或者没通过过任何一题，这个人是绝对不出现在列表里的。 
//6.结构体，排序
//7.主要是题意的理解，下面这组测试用例的结果如果不一致就会过不了2和4
//4 4 1
//10 20 30 40
//00001 4 0
//---->1 00001 0 - - - 0
struct User{
	int id;
	int perfect = 0;
	int total = -1;
	int problem[6] = {-2, -2, -2, -2, -2, -2};
}; 
int bestscore[6];
bool cmp(User a, User b){
	if(a.total!=b.total) return a.total>b.total;
	else if(a.perfect!=b.perfect) return a.perfect>b.perfect;
	else return a.id<b.id;
}
int main(){
	int N, K, M;
	cin>>N>>M>>K;
	User users[N+1];
	for(int i = 1;i<=N;i++){
		users[i].id = i;
	}
	for(int i = 1;i<=M;i++) cin>>bestscore[i];
	for(int i = 0;i<K;i++){
		int a, b, c;
		scanf("%000005d %d %d", &a, &b, &c);
		if(c>users[a].problem[b]) users[a].problem[b] = c;
	}
	for(int i = 1;i<=N;i++){
		for(int j = 1;j<=M;j++){
			if(users[i].problem[j]>=0){
				if(users[i].total==-1) users[i].total = 0;
				users[i].total+=users[i].problem[j];
				if(users[i].problem[j]==bestscore[j]) users[i].perfect ++;
			}
		}
	}
	sort(users+1, users+N+1, cmp);
	int c = 1;
	int t = users[1].total;
	for(int i = 1;i<=N;i++){
		if(users[i].total==-1) break; 
		if(users[i].total!=t){
			c = i;
			t = users[i].total;
		}
		printf("%d %000005d %d ",c, users[i].id, users[i].total);
		for(int j = 1;j<=M;j++){
			if(users[i].problem[j]==-2) cout<<"-";
			else if(users[i].problem[j]==-1) cout<<0;
			else cout<<users[i].problem[j];
			if(j!=M) cout<<" "; 
		}
		cout<<endl;
	}
	return 0;
}